// 版权归GoFrame作者(https://goframe.org)所有。保留所有权利。
//
// 本源代码形式受MIT许可证条款约束。
// 如果未随本文件一同分发MIT许可证副本，
// 您可以在https://github.com/gogf/gf处获取。
// md5:a9832f33b234e3f3

package 安全变量类

import (
	"strconv"
	"sync/atomic"

	gconv "gitee.com/go_888/goframe/util/gconv"
)

// X结构_整数 是一个结构体，用于实现类型int的并发安全操作。 md5:73f0c87f02f7764f
type X结构_整数 struct {
	value int64
}

// X创建整数 创建并返回一个并发安全的 int 类型的对象，其初始值为 `value`。
// md5:2bb0b2973897c335
func X创建整数(值 ...int) *X结构_整数 {
	if len(值) > 0 {
		return &X结构_整数{
			value: int64(值[0]),
		}
	}
	return &X结构_整数{}
}

// X浅拷贝对象 为整型类型创建并返回一个新的并发安全的对象克隆。 md5:170a4dc1f40b5178
func (v *X结构_整数) X浅拷贝对象() *X结构_整数 {
	return X创建整数(v.X取值())
}

// X设置值 原子地将 `value` 存储到 t.value 中，并返回 t.value 的旧值。 md5:2ce98b05d0290b37
func (v *X结构_整数) X设置值(值 int) (旧值 int) {
	return int(atomic.SwapInt64(&v.value, int64(值)))
}

// X取值原子性地加载并返回t.value。 md5:429a11b89436cc12
func (v *X结构_整数) X取值() int {
	return int(atomic.LoadInt64(&v.value))
}

// Atomically 将 `delta` 增加到 t.value 中，并返回新的值。 md5:73547274aea5fe91
func (v *X结构_整数) X追加(值 int) (新值 int) {
	return int(atomic.AddInt64(&v.value, int64(值)))
}

// X比较并交换 执行针对值的比较并交换操作。 md5:4c2d06b4167bee48
func (v *X结构_整数) X比较并交换(旧值, 新值 int) (已交换 bool) {
	return atomic.CompareAndSwapInt64(&v.value, int64(旧值), int64(新值))
}

// String 实现了 String 接口，用于字符串打印。 md5:9f0b8c0bcf2362d3
func (v *X结构_整数) String() string {
	return strconv.Itoa(v.X取值())
}

// MarshalJSON 实现了接口 MarshalJSON 以供 json.Marshal 使用。 md5:43c3b36e60a18f9a
func (v X结构_整数) MarshalJSON() ([]byte, error) {
	return []byte(strconv.Itoa(v.X取值())), nil
}

// UnmarshalJSON实现了json.Unmarshal接口的UnmarshalJSON方法。 md5:f6766b88cf3d63c2
func (v *X结构_整数) UnmarshalJSON(b []byte) error {
	v.X设置值(gconv.X取整数(string(b)))
	return nil
}

// UnmarshalValue 是一个接口实现，用于将任何类型的值设置为 `v`。 md5:f1b49be4502b95a4
func (v *X结构_整数) UnmarshalValue(值 interface{}) error {
	v.X设置值(gconv.X取整数(值))
	return nil
}

// X深拷贝实现当前类型的深拷贝接口。 md5:9cfbcb08109f6ce1
func (v *X结构_整数) X深拷贝() interface{} {
	if v == nil {
		return nil
	}
	return X创建整数(v.X取值())
}
